package cn.com.pajx.pajx_smart_platform.tools;

import android.animation.Animator;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.net.Uri;
import android.os.Build;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.ViewPropertyAnimator;
import android.view.WindowManager;

import java.io.File;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

import cn.com.pajx.pajx_smart_platform.BaseApp;

/**
 * Created by ruancw on 2023/04/03.
 * 通用方法工具类
 */

public class CommonUtil {

    /**
     * 获取状态栏高度
     *
     * @param activity activity
     * @return int
     */
    public static int getStatusBarHeight(Activity activity) {
        Resources resources = activity.getResources();
        @SuppressLint("InternalInsetResource")
        int resourceId = resources.getIdentifier("status_bar_height", "dimen", "android");
        return resources.getDimensionPixelSize(resourceId);
    }

    /**
     * 获取屏幕的宽度（单位：px）
     *
     * @return 屏幕宽px
     */
    public static int getScreenWidth() {
        WindowManager windowManager = (WindowManager) BaseApp.getInstance().getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics dm = new DisplayMetrics();// 创建了一张白纸
        assert windowManager != null;
        windowManager.getDefaultDisplay().getMetrics(dm);// 给白纸设置宽高
        return dm.widthPixels;
    }

    /**
     * 获取屏幕的高度（单位：px）
     *
     * @return 屏幕高px
     */
    public static int getScreenHeight() {
        WindowManager windowManager = (WindowManager) BaseApp.getInstance().getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics dm = new DisplayMetrics();// 创建了一张白纸
        assert windowManager != null;
        windowManager.getDefaultDisplay().getMetrics(dm);// 给白纸设置宽高
        return dm.heightPixels;
    }

    public static int dp2px(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }

    /**
     * 获取当前app的版本名
     *
     * @return 版本号1.0.1
     */
    @SuppressLint("WrongConstant")
    public static String getVersionName(Context c) {
        String verName = null;
        try {
            verName = c.getPackageManager().getPackageInfo(c.getPackageName(),
                    1).versionName;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return verName;
    }

    /**
     * 获取当前app的版本号
     *
     * @return 版本号100
     */
    public static int getVersionCode(Context c) {
        int verCode = 0;
        try {
            verCode = c.getPackageManager().getPackageInfo(c.getPackageName(),
                    0).versionCode;
        } catch (Exception e) {
            e.printStackTrace();

        }
        return verCode;
    }

    /**
     * 获取手机型号
     *
     * @return 手机型号
     */
    public static String getSystemModel() {
        try {
            return Build.MODEL;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "model";
    }

    /**
     * 判断是否是Android Q版本
     *
     * @return 布尔值
     */
    public static boolean checkedAndroid_Q() {
        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q;
    }

    /**
     * 保留两位小数
     *
     * @param d double
     * @return String
     */
    @SuppressLint("DefaultLocale")
    private static String twoDot(double d) {
        return String.format("%.2f", d);
    }

    /**
     * 点击动画
     *
     * @param v view
     */
    public static void animateClickView(final View v,
                                        final ClickAnimation callback) {
        ViewPropertyAnimator animator = v.animate();//ViewPropertyAnimator 查看属性动画
        animator.setListener(new Animator.AnimatorListener() {

            @Override
            public void onAnimationStart(Animator animation) {

            }

            @Override
            public void onAnimationRepeat(Animator animation) {

            }

            @Override
            public void onAnimationEnd(Animator animation) {
                v.setScaleX(1);
                v.setScaleY(1);
                v.setAlpha(1);
                if (callback != null) {
                    callback.onClick(v);
                }
            }

            @Override
            public void onAnimationCancel(Animator animation) {

            }
        });
        animator.scaleX(2).scaleY(2).alpha(0.0f).start();

    }

    /**
     * 动画回调接口
     */
    public interface ClickAnimation {
        void onClick(View v);
    }

    // 判断是否为emial
    public static boolean checkEmail(String emailstr) {
        Pattern p = Pattern.compile("^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\\.)+[a-z]{2,3}$");
        Matcher m = p.matcher(emailstr);
        return m.matches();
    }

    /**
     * 判定EditText 输入是否为汉字
     *
     * @param c 字符
     * @return boolean
     */
    private static boolean isChinese(char c) {
        Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
        return ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
                || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
                || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
                || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
                || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
                || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS
                && c >= 0x4E00 && c <= 0x9FA5;
    }

    /**
     * 检测String是否全是中文（这里输入名字的时候 有点问题：就是可以输入汉语“，！？”。 所以用下面的正则表达式再次进行判定）
     *
     * @param name 名字
     * @return boolean
     */
    public static boolean checkIsChinese(String name) {
        boolean res = true;
        char[] cTemp = name.toCharArray();
        for (int i = 0; i < name.length(); i++) {
            if (!isChinese(cTemp[i])) {
                res = false;
                break;
            }
        }
        return res;
    }

    /**
     * 用正则表达式 限定EditText只可以输入汉字
     *
     * @param str 字符串
     * @return 字符串
     */
    public static String stringFilter(String str) throws PatternSyntaxException {
        // 只允许字母、数字和汉字
        String regEx = "[^a-zA-Z0-9一-龥]";
        Pattern p = Pattern.compile(regEx);
        Matcher m = p.matcher(str);
        return m.replaceAll("").trim();
    }

    /**
     * 验证是否是手机号
     *
     * @param mobiles 号码
     * @return true  是手机号
     */
    public static boolean isMobilePhone(String mobiles) {
        /*
         * 移动：134、135、136、137、138、139、150、151、157(TD)、158、159、187、188
         * 联通：130、131、132、152、155、156、185、186 电信：133、153、180、189、（1349卫通）
         * 总结起来就是第一位必定为1，第二位必定为3或5或8，其他位置的可以为0-9
         */
        String telRegex = "[1][34587]\\d{9}";// "[1]"代表第1位为数字1，"[358]"代表第二位可以为3、5、8中的一个，"\\d{9}"代表后面是可以是0～9的数字，有9位。
        if (TextUtils.isEmpty(mobiles))
            return false;
        else
            return mobiles.matches(telRegex);
    }

    // 检验是否是6位数字的验证码格式
    public static boolean isVerifyCode(String code) {
        return code.matches("^\\d{6}$");
    }

    /**
     * 判断是否打开了允许虚拟位置,如果打开了 则弹窗让他去关闭
     */
    public static boolean isAllowMockLocation(final Activity context) {
        boolean isOpen = Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.ALLOW_MOCK_LOCATION, 0) != 0;

        //该判断API是androidM以下的API,由于Android M中已经没有了关闭允许模拟位置的入口,所以这里一旦检测到开启了模拟位置,并且是android M以上,则
        //默认设置为未有开启模拟位置
        if (isOpen && Build.VERSION.SDK_INT > 22) {
            isOpen = false;
        }
        return isOpen;
    }

    /**
     * 字符串转数组
     *
     * @param str 字符串
     * @return 字符串数组
     */
    public static String[] changeToArr(String str) {

        if ("".equals(str) || "null".equals(str) || str == null)
            return null;
        String[] ret = new String[]{};
        if (str.lastIndexOf(",") == str.length() - 1) {
            str = str.substring(0, str.length() - 1);
            ret = str.split(",");
        }
        return ret;
    }

    public static void callPhone(Context mContext, String phone) {
        Intent intent = new Intent(Intent.ACTION_DIAL);
        Uri data = Uri.parse("tel:" + phone);
        intent.setData(data);
        mContext.startActivity(intent);
    }

    /**
     * 获取32随机码
     *
     * @return 字符串
     */
    public static String getRandomUUID() {
        return UUID.randomUUID().toString().replace("-", "");
    }

    public static void clearAppCache(Context context) {
        try {
            File dir = context.getCacheDir();
            deleteDir(dir);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static boolean deleteDir(File dir) {
        if (dir != null && dir.isDirectory()) {
            String[] children = dir.list();
            for (String child : children) {
                boolean success = deleteDir(new File(dir, child));
                if (!success) {
                    return false;
                }
            }
        }
        return dir.delete();
    }

}
